function [sys,x0,str,ts] = ask_sfun(t,x,u,flag)
% ASK S-Function函数
% 输入参数：
% t: 时间向量
% x: 状态向量（这里为空）
% u: 输入向量，包含数字信号，高电平正弦和低电平正弦
% flag: 状态标识符，用于指定函数的操作模式  
  switch flag
      case 0  % 初始化 %
        [sys,x0,str,ts]=mdlInitializeSizes;
      case 2  % 更新状态 %      
        sys=mdlUpdate(t,x,u);
      case 3  % 输出结果 %
        sys=mdlOutputs(t,x,u);
      case 4  % GetTimeOfNextVarHit %
        sys=mdlGetTimeOfNextVarHit(t,x,u);
      case {1,9}  % 不使用的标识符 %
        sys=[];
      otherwise  % 错误处理 %
        DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
  end
end

%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================

function [sys,x0,str,ts]=mdlInitializeSizes()
% 初始化函数
% 设置函数的输入和输出数量、样本时间等信息

% 设置结构体  
    sizes = simsizes;
    sizes.NumContStates  = 0;   % 连续状态数量为0
    sizes.NumDiscStates  = 512; % 离散状态数量为0
    sizes.NumOutputs     = 1;   % 输出数量为1
    sizes.NumInputs      = 3;   % 输入数量为3
    sizes.DirFeedthrough = 0;   % 有直接通道
    sizes.NumSampleTimes = 1;   % 样本时间数量为1

% 指定样本时间    
    ts = [0 0];    

% 初始化状态向量    
    x0 = [];    

% 设置函数名    
    str = 'ask_sfun';    

% 返回结构体   
    sys = simsizes(sizes);
end

%=============================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%=============================================================================

% function sys=mdlDerivatives()
%     sys = [];
% end

%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================

function sys=mdlUpdate(x,u)
    for ii=512:-1:2
        x(ii)=x(ii-1);
    end
    x(1)=u;
    sys = x;
end

%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================

function sys=mdlOutputs(t,u) % 具体函数
% 输出函数
% 计算ASK信号

% 获取输入参数
    f_high = u(2); % 高电平正弦频率
    f_low = u(3); % 低电平正弦频率
    digital_signal = u(1); % 数字信号
    t_sample = t(1); % 当前样本时间
    t_symbol = t_sample:1/f_high:t_sample+1/f_high; % 符号时间
    
% 根据数字信号选择高电平正弦或低电平正弦
    if digital_signal == 1 % 数字信号为1，选择高电平正弦
        output_signal = sin(2*pi*f_high*t_symbol);
    else % 数字信号为0，选择低电平正弦
        output_signal = sin(2*pi*f_low*t_symbol);
    end
    
% 返回ASK信号
    sys = output_signal;
end

%=============================================================================
% mdlGetTimeOfNextVarHit
% Return the time of the next hit for this block.  Note that the result is
% absolute time.  Note that this function is only used when you specify a
% variable discrete-time sample time [-2 0] in the sample time array in
% mdlInitializeSizes.
%=============================================================================

function sys=mdlGetTimeOfNextVarHit(t)
    sampleTime = 1;    %  Example, set the next hit to be one second later.
    sys = t + sampleTime;
end

%=============================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%=============================================================================

% function sys=mdlTerminate()
%     sys = [];
% end
